home *** CD-ROM | disk | FTP | other *** search
/ Aminet 16 / Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso / Aminet / misc / emu / zxtools.lha / src.lha / Grabber.S next >
Text File  |  1994-10-18  |  7KB  |  497 lines

  1. ùúùúÿÊNÿÊNÿÊNÿÊNÿÊNÿÊNÿÊNÿÊNÿÊN;---------------T
  2.  
  3. debug    equ    0
  4.  
  5.     ifne    debug
  6.     lea    cli(pc),a0
  7.     moveq    #cliend-cli,d0
  8.     bra.b    aa
  9. cli    dc.b    'ram:loaded'
  10.     dc.b    10
  11. cliend    
  12.     even
  13.     endc
  14.  
  15.     incdir    'include34/'
  16.     include    'exec/types.i'
  17.     include    'exec/exec_lib.i'
  18.     include    'devices/serial.i'
  19.     include    'devices/timer.i'
  20.     include    'libraries/dos.i'
  21.     include    'libraries/dos_lib.i'
  22.     include    'mine.i'
  23.  
  24.     addwatch    a4,h
  25.     addwatch    a5,h
  26.     
  27. aa    move.l    sp,stack
  28.  
  29.     sf    -1(a0,d0)    ;null terminated
  30.     move.l    a0,a5
  31.     moveq    #32,d0
  32. .loop    cmp.b    (a5)+,d0
  33.     beq.b    .loop
  34.     tst.b    -(a5)
  35.     beq.w    Error
  36.  
  37.     move.l    4.w,a6
  38.  
  39.     lea    dosnm(pc),a1
  40.     jsrlib    OldOpenLibrary
  41.     move.l    d0,dosbas
  42.     beq.w    nodos
  43.  
  44.     lea    SerialPortName(pc),a1
  45.     bsr.w    CreatePort0
  46.     move.l    d0,SerPort
  47.     beq.w    NoPort
  48.  
  49.     move.l    d0,a1
  50.     moveq    #ioextser_size,d0
  51.     bsr.w    CreateIO
  52.     move.l    d0,SerIO
  53.     beq.w    NoSerIO
  54.  
  55.     move.l    d0,a4
  56.         
  57.     moveq    #serf_7wire+serf_shared,d0
  58.     and.b    serdefflags(pc),d0
  59.     move.b    d0,io_serflags(a4)    ;7wire, shared
  60.  
  61.     lea    devname(pc),a0
  62.     moveq    #0,d0        ;unit
  63.     move.l    a4,a1
  64.     moveq    #0,d1        ;flags
  65.     jsrlib    OpenDevice
  66.     tst.l    d0
  67.     bmi.w    NoDevice
  68.  
  69. **************************** Main Program *******************************
  70.  
  71. main    bsr.w    SetParams    ;set your device parameters
  72.  
  73.     lea    filename,a1
  74. .loop    move.b    (a5)+,(a1)+
  75.     bne.b    .loop
  76.     subq.l    #1,a1
  77.     lea    FileExtension(pc),a5
  78. .loop2    move.b    (a5)+,(a1)+
  79.     bne.b    .loop2
  80.     lea    -2(a1),a5
  81.  
  82. Loading    moveq    #2,d0
  83.     bsr.w    ReceiveXbytes
  84.     tst.l    d0
  85.     bne.b    allok
  86.  
  87.     lea    mybuffer,a0
  88.     move.w    (a0)+,d0
  89.     move.l    d0,d7
  90.     addq.l    #1,d0        ;Add Checksum
  91.  
  92.     bsr.w    ReceiveBytes
  93.     tst.l    d0
  94.     bne.b    .here
  95.  
  96.     lea    filename,a0
  97.     lea    mybuffer+2,a1
  98.     move.l    d7,d0
  99.     bsr.w    SaveFile
  100.  
  101.     move.l    d7,d0
  102.     lea    mybuffer,a0
  103.     bsr.b    CheckBuffer
  104.     beq.b    ReadOK
  105.  
  106. .here    move.w    d0,$dff180
  107.     addq.w    #3,d0
  108.     btst    #6,$bfe001
  109.     bne.b    .here
  110.     bra.b    Exitus
  111.  
  112. ReadOK    
  113.     bsr.b    IncFileExt
  114.  
  115.     bra.b    Loading
  116.     
  117. allok    clr.l    errornr
  118.  
  119. *************************** closing device ******************************
  120.     
  121. Exitus    move.l    stack(pc),sp
  122.  
  123.     move.l    a4,a1
  124.     jsrlib    CloseDevice
  125.     
  126. NoDevice    move.l    serIO,a1
  127.     bsr.w    RemoveIO
  128.  
  129. NoSerIO    move.l    serport,a1
  130.     bsr.w    RemovePort
  131. noport
  132.     move.l    dosbas,a1
  133.     jsrlib    CloseLibrary
  134.  
  135. nodos
  136. Error    move.l    errornr(pc),d0
  137.     rts
  138.  
  139. stack    dc.l    0
  140. errornr    dc.l    20
  141.  
  142. IncFileExt    move.l    a5,a0
  143. .loop    addq.b    #1,(a0)
  144.     cmp.b    #'9',(a0)
  145.     bls.b    .ok
  146.     move.b    #'0',(a0)
  147.     subq.l    #1,a0
  148.     bra.b    .loop
  149. .ok    rts
  150.  
  151. CheckBuffer    moveq    #0,d1    ;xor
  152.     move.b    (a0)+,d2    ;add
  153.     not.b    d2
  154.     move.b    (a0)+,d3
  155.     not.b    d3
  156.     add.b    d3,d2
  157.     subq.w    #1,d0
  158.     bcs.b    .done
  159. .loop    move.b    (a0)+,d3
  160.     eor.b    d3,d1
  161.     not.b    d3
  162.     add.b    d3,d2
  163.     dbra    d0,.loop
  164.     tst.b    d1
  165.     bne.b    .error
  166. .done    cmp.b    (a0),d2
  167. .error    rts
  168.  
  169.  
  170. *************************** Parameter parsing ***************************
  171.  
  172. SkipSpaces    moveq    #32,d0
  173. .loop    cmp.b    (a5)+,d0
  174.     beq.b    .loop
  175. testend    tst.b    -(a5)
  176.     rts
  177.  
  178. getnumber    moveq    #0,d0
  179.     move.l    d0,d1
  180.     moveq    #10,d2
  181. .loop    move.b    (a5)+,d1
  182.     sub.b    #'0',d1
  183.     bcs.B    testend
  184.     cmp.b    d2,d1
  185.     bcc.B    testend
  186.     mulu    d2,d0
  187.     add    d1,d0
  188.     bra.B    .loop
  189.  
  190. ********************** set serial.device parameters *********************
  191.  
  192. SetParams    move    #sdcmd_setparams,io_command(a4)
  193.  
  194.     lea    io_CtlChar(a4),a1
  195.     lea    ser_defaults(pc),a0
  196.     moveq    #(serdefslen+3)/4-1,d0
  197. setserdefs    move.l    (a0)+,(a1)+
  198.     dbra    d0,setserdefs
  199.  
  200.     move.l    a4,a1
  201.     bra.w    DelayedDoIO
  202.     
  203. *************************** get some bytes *****************************
  204.  
  205. ReceiveXbytes    lea    mybuffer,a0
  206.  
  207. ;a0 = buffer, d0=len, a4 ioreq
  208.  
  209. ReceiveBytes    pushm    d2-d7/a2-a6
  210.  
  211.     move.l    a0,io_data(a4)
  212.     move.l    d0,io_length(a4)
  213.     move.w    #cmd_read,io_command(a4)
  214.  
  215.     move.l    a4,a1
  216.     bsr.w    DelayedDoIO
  217.     popm    d2-d7/a2-a6
  218.     rts
  219.  
  220. ********************************************************************
  221.  
  222. ;CreatePort(pri,name)(d0,a1)
  223.  
  224. CreatePort0    moveq    #0,d0
  225.  
  226. CreatePort    pushm    a5-a6
  227.  
  228.     sub.l    a5,a5
  229.     
  230.     move.l    4.w,a6
  231.     pushm    d0/a1
  232.     moveq    #mp_size,d0
  233.     move.l    #$10001,d1    ;public clear
  234.     jsrlib    AllocMem
  235.     popm    d1/a1
  236.     tst.l    d0
  237.     beq.b    .nomem
  238.  
  239.     move.l    d0,a5
  240.     move.b    #NT_MSGPORT,ln_type(a5)
  241.     move.b    d1,ln_pri(a5)
  242.     move.l    a1,ln_name(a5)
  243.  
  244. ;port is signal cause of clear mem
  245.  
  246.     moveq    #-1,d0
  247.     jsrlib    AllocSignal
  248.     move.b    d0,mp_sigbit(a5)
  249.     bmi.b    RemovePort|.nosignal
  250.     
  251.     sub.l    a1,a1
  252.     jsrlib    FindTask
  253.     move.l    d0,mp_sigtask(a5)
  254.  
  255.     move.l    a5,a1
  256.     jsrlib    AddPort
  257.  
  258. .nomem    move.l    a5,d0
  259.     popm    a5-a6
  260.     rts
  261.  
  262. ;RemovePort(port)(a1)
  263.  
  264. RemovePort    pushm    a5-a6
  265.  
  266.     move.l    4.w,a6
  267.     move.l    a1,a5
  268.  
  269.     jsrlib    RemPort
  270.  
  271. .replymsgs    move.l    a5,a0
  272.     jsrlib    GetMsg
  273.     tst.l    d0
  274.     beq.b    .nomoremsgs
  275.     move.l    d0,a1
  276.     cmp.l    mn_replyport(a1),a5
  277.     beq.b    .replymsgs
  278.     jsrlib    ReplyMsg
  279.     bra.b    .replymsgs
  280.  
  281. .nomoremsgs    move.b    mp_sigbit(a5),d0
  282.     jsrlib    FreeSignal
  283.  
  284. .nosignal    move.l    a5,a1
  285.     moveq    #mp_size,d0
  286.     jsrlib    FreeMem
  287.     
  288.     moveq    #0,d0
  289.     popm    a5-a6
  290.     rts
  291.  
  292. ;CreateIO(size,msgport)(d0,a1)
  293.  
  294. CreateIO    pushm    a5-a6
  295.  
  296.     sub.l    a5,a5
  297.     
  298.     move.l    4.w,a6
  299.     pushm    d0/a1
  300.     move.l    #$10001,d1
  301.     jsrlib    AllocMem
  302.     popm    d1/a1
  303.     tst.l    d0
  304.     beq.b    .nomem
  305.  
  306.     move.l    d0,a5
  307.     move.w    d1,mn_length(a5)
  308.     move.l    a1,mn_replyport(a5)
  309.  
  310. .nomem    move.l    a5,d0
  311.     popm    a5-a6
  312.     rts
  313.  
  314. ;RemoveIO(IOrequest)(a1)
  315.  
  316. RemoveIO    push    a6
  317.     move.l    4.w,a6
  318.     moveq    #0,d0
  319.     move.w    mn_length(a1),d0
  320.     jsrlib    FreeMem
  321.     pop    a6
  322.     rts
  323.  
  324. ;DelayedIO(IOrequest)
  325.  
  326. DelayedDoIO    pushm    d2-d3/d7/a3-a6
  327.     push    mn_replyport(a1)
  328.  
  329.     moveq    #-1,d7
  330.  
  331.     move.l    4.w,a6
  332.  
  333.     move.l    a1,a3
  334.  
  335.     lea    TimerPortName(pc),a1
  336.     bsr.w    CreatePort0
  337.     tst.l    d0
  338.     beq.w    .noport
  339.  
  340.     move.l    d0,a5
  341.  
  342.     move.l    a5,a1
  343.     moveq    #iotv_size,d0
  344.     bsr.b    CreateIO
  345.     tst.l    d0
  346.     beq.b    .noio
  347.     
  348.     move.l    d0,a4
  349.  
  350.     lea    TimerDevName(pc),a0
  351.     moveq    #unit_vblank,d0    
  352.     move.l    a4,a1
  353.     moveq    #0,d1
  354.     jsrlib    OpenDevice
  355.     tst.l    d0
  356.     bne.b    .NoDevice
  357.  
  358.     move.l    a3,a1
  359.     move.l    a5,mn_replyport(a1)
  360.     jsrlib    SendIO
  361.  
  362. .loop    move    #tr_addrequest,io_command(a4)
  363.     move.l    #1,iotv_time+tv_secs(a4)
  364.     clr.l    iotv_time+tv_micro(a4)
  365.     move.l    a4,a1
  366.     jsrlib    SendIO
  367.  
  368.     move.l    a5,a0
  369.     jsrlib    WaitPort
  370.  
  371.     move.l    a5,a0
  372.     jsrlib    GetMsg
  373.     cmp.l    d0,a4
  374.     bne.b    .Userscameback
  375.  
  376.     moveq    #0,d1
  377.     jsrlib    SetSignal
  378.     and.w    #sigbreakf_ctrl_c,d0
  379.     bne.b    .break
  380.     bra.b    .loop
  381.  
  382. .UsersCameBack    moveq    #0,d7
  383.     move.l    a4,a1
  384.     bra.b    .cont
  385.  
  386. .break    move.l    a3,a1
  387. .cont    jsrlib    AbortIO
  388.  
  389.     move.l    a5,a0
  390.     jsrlib    WaitPort
  391.  
  392.     move.l    a5,a0
  393.     jsrlib    GetMsg
  394.  
  395.     move.l    a4,a1
  396.     jsrlib    CloseDevice
  397.  
  398. .nodevice    move.l    a4,a1
  399.     bsr.w    RemoveIO
  400.  
  401. .noio    move.l    a5,a1
  402.     bsr.w    RemovePort
  403.  
  404. .noport    move.l    d7,d0
  405.     pop    mn_replyport(a3)
  406.     popm    d2-d3/d7/a3-a6
  407.     rts
  408.  
  409. ************************** File Handling **********************
  410.  
  411. ;void (a0 filename, d0 len, a1 address)
  412.  
  413. SaveFile    pushm    d2-d7/a2-a6
  414.     move.l    a1,a5
  415.     move.l    d0,d6
  416.     
  417.     move.l    dosbas,a6
  418.  
  419.     move.l    a0,d1
  420.     move.l    #mode_newfile,d2
  421.     jsrlib    Open
  422.     move.l    d0,d7
  423.     beq.b    .fail
  424.  
  425.     move.l    d7,d1
  426.     move.l    a5,d2
  427.     move.l    d6,d3
  428.     jsrlib    Write
  429.  
  430.     move.l    d7,d1
  431.     jsrlib    Close
  432.  
  433. .fail    popm    d2-d7/a2-a6
  434.     rts
  435.  
  436. ***************************************************************
  437.  
  438. dosbas    dc.l    0
  439.  
  440. serio    dc.l    0
  441.  
  442. serport    dc.l    0
  443.  
  444. ser_defaults    dc.b    $11        ;CtlChar - xON
  445.     dc.b    $13        ;xOFF
  446.     dc.b    $0        ;INQ
  447.     dc.b    $0        ;ACQ
  448.     
  449.     dc.l    $2000        ;RBuffLen
  450.  
  451.     dc.l    0        ;extflags mspon,msp (mark-space parity)
  452.  
  453. Baud    dc.l    19200        ;Baud
  454.  
  455.     dc.l    250000        ;BrkTime
  456.  
  457.     dc.b    0,0,0,0,0,0,0,0        ;TermArray
  458.  
  459.     dc.b    8        ;ReadLen
  460.  
  461.     dc.b    8        ;WriteLen
  462.  
  463.     dc.b    1        ;StopBits
  464.  
  465. serdefflags    dc.b    serf_xdisabled+serf_7wire
  466.  
  467.                     ;xdisabled
  468.                     ;eofmode (for each request)
  469.                     ;shared (on open too)
  470.                     ;rad_boogie
  471.                     ;queuedbrk (for each break)
  472.                     ;7wire (on open too)
  473.                     ;party_odd
  474.                     ;party_on
  475. serdefslen    equ    *-ser_defaults
  476.             
  477. SerialPortName    dc.b    'GB Serial',0
  478.  
  479. TimerPortName    dc.b    'GB Timer',0
  480.  
  481. TimerDevName    dc.b    'timer.device',0
  482.  
  483. DevName    dc.b    'serial.device',0
  484.  
  485. dosnm    dc.b    'dos.library',0
  486.  
  487. FileExtension    dc.b    '.000',0
  488.  
  489.     dc.b    '$VER: ZX->Amiga File Grabber 0.3 (18.10.94)',13,10
  490.     dc.b    '(C) 1994 Patrik Rak - Raxoft'
  491.  
  492.     section    buffer,bss
  493. filename    ds.b    256
  494. mybuffer    ds.b    65536+4
  495. mybufflen    equ    *-mybuffer
  496.  
  497.